package org.wdcode.core.csv;

import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.wdcode.common.exception.CustomException;
import org.wdcode.common.exception.CustomRuntimeException;

import org.wdcode.common.log.WdLogs;
import org.wdcode.common.tools.Lists;
import org.wdcode.common.tools.Maps;
import org.wdcode.common.util.CommonUtil;

import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter;

/**
 * 操作CSV格式文件 <br/>
 * <h2>注: 本操作需要使用opencsv包</h2>
 * @author WD
 * @since JDK6
 * @version 1.0 2009-03-28
 */
final class CsvImpl implements Csv {
	// CSV读取器
	private CSVReader	reader;
	// CSV写入器
	private CSVWriter	writer;

	/**
	 * 构造方法
	 * @param reader 读取器
	 * @param writer 写入器
	 */
	public CsvImpl(Reader reader, Writer writer) {
		this.reader = new CSVReader(reader);
		this.writer = new CSVWriter(writer);
	}

	/**
	 * 构造方法
	 * @param reader 读取器
	 */
	public CsvImpl(Reader reader) {
		this.reader = new CSVReader(reader);
	}

	/**
	 * 构造方法
	 * @param writer 写入器
	 */
	public CsvImpl(Writer writer) {
		this.writer = new CSVWriter(writer);
	}

	/**
	 * 读取出所有元素到列表中
	 * @return List 所有集合
	 */
	public final List<String[]> readAll() {
		try {
			return reader.readAll();
		} catch (IOException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 读取出所有元素到列表中
	 * @return List key标题 value值
	 */
	public final List<Map<String, String>> readByAll() {
		// 读取出所有的内容
		List<String[]> list = readAll();
		// 判断list为空返回空的列表
		if (CommonUtil.isEmpty(list)) {
			return Collections.emptyList();
		}
		// 获得列名
		String[] colName = list.get(0);
		// 获得大小
		int size = list.size();
		// 声明列表
		List<Map<String, String>> ls = Lists.getList(size - 1);
		// 声明一个Map
		Map<String, String> map = null;
		// 声明一个字符串数组 用于保存值
		String[] value = null;
		// 循环列表
		for (int i = 1; i < size; i++) {
			// 获得字符串数组
			value = list.get(i);
			// 实例化Map
			map = Maps.getMap(colName.length);
			// 循环数据
			for (int j = 0; j < colName.length; j++) {
				// 如果列名为空跳出循环
				if (CommonUtil.isEmpty(colName[j])) {
					continue;
				}
				// 添加到Map
				map.put(colName[j], value[j]);
			}
			// 添加到列表
			ls.add(map);
		}
		// 返回列表
		return ls;
	}

	/**
	 * 读取一行
	 * @return String[]
	 */
	public final String[] readNext() {
		try {
			return reader.readNext();
		} catch (IOException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 写入全部数据到CSV
	 * @param list
	 * @throws CustomException
	 */
	public final void writeAll(List<String[]> list) {
		try {
			// 写
			writer.writeAll(list);
			// 输出缓存
			writer.flush();
		} catch (IOException e) {
			WdLogs.error(e);
		}
	}

	/**
	 * 写一行
	 * @param nextLine
	 * @throws CustomException
	 */
	public final void writeNext(String[] nextLine) {
		try {
			// 写一行
			writer.writeNext(nextLine);
			// 输出缓存
			writer.flush();
		} catch (IOException e) {
			WdLogs.error(e);
		}
	}

	/**
	 * 关闭方法
	 */
	public final void close() {
		try {
			// 关闭读取器
			if (!CommonUtil.isEmpty(reader)) {
				reader.close();
			}
		} catch (IOException e) {
			// 记录异常
			WdLogs.error(e);
		} finally {
			// 置null
			reader = null;
		}
		try {
			// 关闭写入器
			if (!CommonUtil.isEmpty(writer)) {
				writer.flush();
				writer.close();
			}
		} catch (IOException e) {
			// 记录异常
			WdLogs.error(e);
		} finally {
			writer = null;
		}
	}
}
